'use strict';
define([], function()
{
    //事件日志
    var EventDispatcher = Class.extend({

        //日志对象
        //对象说明
        //{
        //  ui.navigation.events.TRANSITION_END: Array[12],
        //  ui.navigation.events.PREVIOUS: Array[13],
        //  ui.navigation.events.NEXT: Array[14]
        // }
        _listeners: {},

        //日志记录器
        //参数说明
        //type ui.navigation.events.PREVIOUS 或者 ui.navigation.events.NEXT 事件名称
        //listener 对应事件触发函数
        addEventListener: function(type,listener){
            if(!this._listeners[type]){
                this._listeners[type] = [];
            }
            //下面是事件注入命名只能为单一的
            //多事件绑定可以用这个，可以用force来强行多绑定
            this._listeners[type].push(listener);
            if(this._listeners[type].length == 0){
                //增加记录事件
                this._listeners[type].push(listener);
            }
            //提示多事件注入
            else{
                //TODO:框架这里需要改进
                //直接替换事件，不支持统一对象绑定多事件
                this._listeners[type] = [listener];

            }
        },

        //事件移除器
        removeEventListener: function(type,listener) {
            if(this._listeners[type]) {
                var index = this._listeners[type].indexOf(listener);
                if(index !== -1) {
                    this._listeners[type].splice(index,1);
                }
            }
        },

        //事件驱动
        //驱动事件dispatchEvent(action)
        //参数action为触发的事件
        dispatchEvent: function() {
            //listeners为事件数组
            var listeners;

            //arguments代表函数的参数
            //listeners = this._listeners中函数的第一个参数
            //listeners = 对应对象的函数
            listeners = this._listeners[arguments[0]];
            for(var key in listeners) {
                //key是数组的遍历长度
                //作用使用key来驱动arguments[0]事件
                //arguments[0] 参数为
                // ui.navigation.events.NEXT，
                // ui.navigation.events.PREVIOUS，
                // ui.navigation.events.TRANSITION_END
                //arguments[0] 参数可以用在一个函数里来判断事件名称做不同的事件
                //其中的一个
                listeners[key](arguments[0]);
            }
        }
    });

    return EventDispatcher;
});